// promise 并行执行 promise.all()/ promise.race()
function ajax(url) {
    return new Promise(function(resolve, reject) {
        // foo() 可以捕获到异常
        if(window.XMLHttpRequest) {
            var xhr= new XMLHttpRequest();
        }
        else{
            var xhr= new ActiveXObject("Microsoft.XMLHTTP");
        }
        // var xhr = new XMLHttpRequest()
        xhr.open('GET',url)
        xhr.responseType = 'json'
        xhr.onload = function() {
            if(this.status === 200) {
                resolve(this.response)
            }else {
                reject(new Error(this.statusText))
            }
        }
        xhr.send()
    }) 
}
// 返回一个新得promise对象，必须里面的都执行完成 才会完成，
// 必须成功执行 all才会成功执行，有一个任务失败了 这个promise以失败结束
var promise = Promise.all([
    ajax('/api/user.json'),
    ajax('/api/posts.json')
])
// 数组里包含每个异步任务执行的结果
promise.then(function(values) {
    console.log(values)
}).catch(function onRejected (error) {
    console.log("onRejected",error)
})
// 串行和并行组合
Ajax('api/urls.json')
    .then (value=> {
        const urls = Object.values(value) //Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组，值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
        const tasks = urls.map(url => ajax(url))
        return Promise.all(tasks)
    })
    .then(values=> {
        console.log(values)
    })


// promise.race() 也能组合promise 返回一个新得promise
//不同，promise.race() 只会等待第一个结束的任务，他就返回了



// promise的执行次序，它属于微任务会次于主线程 后执行，先于宏任务


